package com.luxsoft.siipap.em.replica.importadores.dbf.cxc;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;

import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowFilter;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowMapper;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.util.DateUtil;
import com.luxsoft.siipap.ventas.model.VentaDet;

public class VentasDetDBFMapper implements DBFRowMapper,DBFRowFilter{
	
	private Date fecha;
	
	
	public Date getFecha() {
		return DateUtil.truncate(fecha, Calendar.DATE);
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	/*
	 * (non-Javadoc)
	 * @see com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowFilter#incluir(java.util.Map)
	 */
	public boolean incluir(Map<String, Object> row) {
		String res=(String)row.get("ALMTIPO");
		boolean ok=(StringUtils.equalsIgnoreCase("FAC",res));
		if(ok){			
			Date fo=(Date)row.get("ALMFECHA");
			boolean togo= DateUtils.isSameDay(fecha, fo);	
			return togo;
		}
		return false;
		
		
	}

	/**
	 * Genera una partidad de venta para un registro de ALMACEXX.DBF
	 * 
	 * 
	 */
	public Object map(Map<String, Object> row) throws Exception {
		
		//System.out.println(row);
		
		final long numero=getSafaLong(row, "ALMNUMER");
		
		
		
		//System.out.println("Mapeando partida: "+numero);
		final Date fecha=(Date)row.get("ALMFECHA");
		final String clave=(String)row.get("ALMARTIC");
		VentaDet det=new VentaDet();
		Producto p=ImportadorSupport.getInstance().buscarProducto(clave);
		det.setProducto(p);
		det.setCantidad(getSafaDouble(row, "ALMCANTI"));
		det.setComentario((String)row.get("ALMOBSER"));
		det.setDocumento(numero);
		
		final String ALMNOMBR=(String)row.get("ALMNOMBR");
		det.setDescripcion(ALMNOMBR);
		
		double ALMPRECI=getSafaDouble(row, "ALMPRECI");
		det.setPrecioLista(BigDecimal.valueOf(ALMPRECI));
		
		double ALMPREFA=getSafaDouble(row, "ALMPREFA");
		det.setPrecio(BigDecimal.valueOf(ALMPREFA));
		
		det.setFactor(getSafaDouble(row, "ALMUNIXUNI"));
		det.setFecha(fecha);
		
		CantidadMonetaria precio=CantidadMonetaria.pesos(det.getPrecio().doubleValue());
		precio=precio.abs();
		double canti=det.getCantidad()/det.getFactor();
		det.setImporte(precio.multiply(canti).amount());		
		
		det.setRenglon(getSafaInt(row, "ALMRENGL"));		
		det.setSubTotal(det.getImporte());
		
		return det;
	}

	
	
	public double getSafaDouble(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.doubleValue():0;
	}
	
	public long getSafaLong(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.longValue():0;
	}
	
	public int getSafaInt(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.intValue():0;
	}	
	

}
